﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "IMepInstance.h"
#include "IMepDeviceType.h"
#include "IConnector.h"

namespace gmep
{
    enum class LightSourceType;
    enum class PowerType;
    class IConnectorManager;

    struct MepDeviceInput final : MepInstanceInput
    {
        using MepInstanceInput::MepInstanceInput;
    };

    class GMEP_MODEL_INTERFACE_EXPORT IMepDevice : public IMepInstance
    {
        DEFINE_CAST_DERIVED(gmep::IMepDevice, gmep::IMepInstance)
    public:
        virtual ~IMepDevice() {}

    public:
        /// \brief 创建机电设备
        /// \param input 输入信息
        /// \return 机电设备指针。返回nullptr表示创建机电设备失败
        static IMepDevice *Create(const MepDeviceInput &input);

        /// \brief 创建视图设备对象
        /// \param input 输入信息
        /// \param modelViewId 视图Id
        /// \return 机电设备指针。返回nullptr表示创建机电设备失败
        static IMepDevice *CreateViewDevice(const MepDeviceInput &input, const gcmp::ElementId &modelViewId);

        /// \brief 获取机电设备类型
        /// \return 机电设备类型
        virtual DevicePartType GetDevicePartType() const = 0;

        /// \brief 获取设备所属的系统的集合
        /// \return 设备所属的系统的集合
        virtual const std::set<gcmp::ElementId> GetMepSystemIds() const = 0;

        /// \brief 定义设备参照平面RegionData的Get函数
        virtual RegenDataId GetReferencePlaneRdId() const = 0;

        ///.\ breif 设置对象视图Id
        virtual bool SetModelViewId(const gcmp::ElementId& modelViewId) = 0;

        /// \brief 获取所在视图对象Id
        ///
        /// 当创建视图对象设备时，视图对象Id为有效值，否则为无效值。
        /// \return 所在视图对象Id
        virtual gcmp::ElementId GetModelViewId() const = 0;

        static gcmp::UniIdentity GetImplementationUid();

        /// \brief 标记tag更新RdId
        virtual void MarkIndependentParameterUpdateRdId() = 0;
        
        /// \brief 定义IndependentLabelUpdateRdId的Get函数
        virtual RegenDataId GetIndependentParameterUpdateRdId()const = 0;
        
        /// \brief 标记设备参数改变RdId
        virtual void MarkDeviceParameterChangeRdId() = 0;

        /// \brief 获得device的tag标记位置点坐标
        virtual gcmp::Vector3d GetMepDeviceIndependentTagPosition(const gcmp::IModelView* pModelView) const = 0;

        /// \brief 给设备添加连接点
        /// 
        /// 给设备添加连接点，目前主要是用于给静压箱添加连接点。
        /// \param baseCoordinate 连接点的坐标系
        /// \param sectionData 连接点的截面数据
        /// \param connectorDomain 连接点所属专业
        /// \return IConnector* 创建的连接点
        virtual gmep::IConnector* AddCustomerConnector(const gcmp::Coordinate3d& baseCoordinate, gcmp::OwnerPtr<gmep::ISectionData> sectionData, gmep::ConnectorDomain connectorDomain) = 0;
        
        /// \brief 移除设备的连接点
        ///
        /// \param connectorId 连接点的id
        /// \return bool
        virtual bool RemoveCustomConnector(int connectorId) = 0;

        /// \brief 得到连接点管理器指针
        /// \return 连接点管理器指针
        virtual const IConnectorManager *GetConnectorManager() const = 0;

        /// \brief 得到连接点管理器指针
        /// \return 连接点管理器指针
        virtual IConnectorManager *GetConnectorManager() = 0;
    };
}
